#include "soc_uart.h"
#include "cms8s6990.h"
#include "soc_cfg.h"


void SOC_UartInit(SOC_UartNo_t no, uint32_t baudrate)
{
	uint16_t  BRTValue = 0;

	/*
	(1)设置UARTx的运行模式
	*/
	UART_ConfigRunMode(no, UART_MOD_ASY_8BIT, UART_BAUD_BRT);
	UART_EnableReceive(no);
	/*
	(2)配置UARTx的波特率
	*/
	UART_ConfigBRTClk(BRT_CLK_DIV_1);	

	UART_EnableDoubleFrequency(no); 							/*波特率使能倍频：SMOD =1*/

	BRTValue = UART_ConfigBaudRate(no, baudrate);

	UART_ConfigBRTPeriod(BRTValue);						/*配置重装值*/
	UART_EnableBRT();										/*使能定时器*/
	/*
	(3)配置IO口
	*/
	GPIO_SET_MUX_MODE(P25CFG,GPIO_MUX_TXD0);			/*TXD0*/
	GPIO_SET_MUX_MODE(P26CFG,GPIO_MUX_RXD0);	 		/*RXD0*/	

	/*
	(4)设置UART中断
	*/
	//  UART_EnableInt(UART0);
	//  IRQ_SET_PRIORITY(IRQ_UART0,IRQ_PRIORITY_LOW);
	//  IRQ_ALL_ENABLE();
}

void SOC_UartSendByte(SOC_UartNo_t no, uint8_t b)
{
	if(no == 0)
	{
		SBUF0 = b;
		while( !(SCON0 & (1<<1)));
		SCON0 &=~(1<<1);
	}	
	else if(no == 1)
	{
		SBUF1 = b;
		while( !(SCON1 & (1<<1)));
		SCON1 &=~(1<<1);
	}
}

void SOC_UartSend(SOC_UartNo_t no, uint8_t *buffer, int len)
{
	int i;

	for(i = 0; i < len; i++)
	{
		SOC_UartSendByte(no, buffer[i]);
	}
}

void SOC_UartSendString(SOC_UartNo_t no, uint8_t *str)
{
	while(*str != '\0')
	{
		SOC_UartSendByte(no, *str++);
	}
}

int SOC_ReadByteBlock(SOC_UartNo_t no)
{
	if(no == S_UART0)
	{
		while(!(SCON0 & (1<<0)));
		SCON0 &=~(1<<0);
		return  SBUF0;	
	}
	else if(no == S_UART1)
	{
		while(!(SCON1 & (1<<0)));
		SCON1 &=~(1<<0);
		return  SBUF1;	
	}
	else
	{
		return -1;
	}
}

int SOC_ReadByte(SOC_UartNo_t no)
{
	if(no == S_UART0)
	{
		if(!(SCON0 & (1<<0)))
			return -1;

		SCON0 &=~(1<<0);
		return  SBUF0;	
	}
	else if(no == S_UART1)
	{
		if(!(SCON1 & (1<<0)))
			return -1;

		SCON1 &=~(1<<0);
		return  SBUF1;	
	}
	else
	{
		return -1;
	}
}

void SOC_UartSetEnableRx(SOC_UartNo_t no, bool en)
{
	if(en)
	{
		UART_EnableReceive(no);
	}
	else
	{
		UART_DisableReceive(no);
	}
}

void SOC_UartSetEnableRx_IT(SOC_UartNo_t no, bool en)
{
	if(en)
	{
		UART_EnableInt(no);
	}
	else
	{
		UART_DisableInt(no);
	}
}

void SOC_UartSetRxCallBack(SOC_UartNo_t no, SOC_IT_CALLBACK_UART cb)
{
	// m_uartRxCallBack[no] = cb;
}

// void SOC_UartRaiseRxEvent(SOC_UartNo_t no)
// {
// 	if(UART_GetReceiveIntFlag(no))
// 	{
// 		uint8_t b = UART_GetBuff(no);
// 		SOC_IT_CALLBACK_UART cb = m_uartRxCallBack[no];

// 		if(cb)
// 			cb(no, b);

// 		UART_ClearReceiveIntFlag(no);	
// 	}	
// }

/******************************************************************************
 ** \brief	 putchar
 ** \param [in] data
 **            	
 ** \return  none
 ** \note   <stdio.h>中需要的函数
 ******************************************************************************/
char putchar (char ch)
{
	SOC_UartSendByte(SOC_LOG_UART_NO, (uint8_t)ch);
	return 0;
}

/******************************************************************************
 ** \brief	 putchar
 ** \param [in] none
 **            	
 ** \return  data
 ** \note   <stdio.h>中需要的函数
 ******************************************************************************/
char getchar (void)
{
	return SOC_ReadByte(SOC_LOG_UART_NO);
}

/********************************************************************************
 ** \brief	 puts 
 **
 ** \param [in]  bytes addr for sending
 **
 ** \return  <stdio.h>中需要的函数
 ******************************************************************************/
int  puts( const char  * s)
{
	while(*s)
	{
		putchar(*s);
		s++;		
	}
	return 0;
}
